<?
/**
 * 
 * GPFAdmin 클래스 : 그누보드 관리자 페이지에서 실행될 플러그인 관리
 *
 * @author	chongmyung.park (http://byfun.com)
 */

if (!defined("GPF")) exit; // 개별 페이지 접근 불가 

include_once GPF_PATH."/lib/gpf.Config.class.php";
include_once GPF_PATH."/lib/gpf.PluginAdmin.class.php";

class GPFAdmin extends GPFObject
{
	/**
	 *
	 * @var 싱글톤 인스턴스
	 */
	protected static $instance = NULL;

	/**
	 * 생성자
	 */
	protected function __construct() {		
		 parent::__construct('admin');
		 $this->afterLoadPlugins();
	}

	/**
	 * Singleton
	 */
	public static function getInstance() {
		if(!isset(self::$instance)) {
			self::$instance = new GPFAdmin();
		}
		return self::$instance;
	}

	/**
	 * 
	 * 플러그인 정렬 : 그누보드 관리자 페이지 > 플러그인 에 정렬된 순서로 메뉴가 보임
	 * 
	 */
	protected function afterLoadPlugins()
	{
		if(!empty($this->plugins)) $this->_subval_asort($this->plugins, 'order');
	
	}

	/**
	 * 
	 * 관리자 메뉴 추가
	 *
	 * @param string $label 관리자 메뉴 텍스트
	 * @param obj $obj {@link GPFPluginAdmin} 객체
	 * @param string $handler $obj 내에 구현된 이벤트 핸들러
	 */
	public function addAdmin($label, $obj, $handler)
	{
		if(!is_a($obj, "GPFAdminPlugin")) gpf_die("GPFAdmin 에는 GPFAdminPlugin 클래스를 상속한 인스턴스만 사용가능합니다.");
		$id = $obj->id;
		$order = ($this->cfg->admin_order[$id] ? $this->cfg->admin_order[$id] : 99999);
		$this->plugins[] = array("label"=>$label, "obj"=>$obj, "handler"=>$handler, "order"=>$order);
	}

	/**
	 *
	 * 관리자 플러그인이 있나?
	 */
	public function hasAdminPlugins()
	{
		return !empty($this->plugins);
	}

	/**
	 *
	 * 관리자 플러그인 목록 반환
	 */
	public function getAdminPlugins()
	{
		return $this->plugins;
	}

	/**
	 *
	 * 관리자 플러그인이 하나 반환
	 */
	public function getAdminPlugin($plugin_id)
	{
		foreach($this->plugins as $idx => $p) {
			if($plugin_id == $p['obj']->id) return $p['obj'];
		}

	}
}
?>
